package com.leinao.model.dao;

import com.leinao.category.dto.CategoryRelationDto;
import com.leinao.category.model.CategoryRelation;
import com.leinao.model.dto.*;
import com.leinao.model.model.Model;
import com.leinao.model.model.ModelProJobRelation;
import com.leinao.project.dto.ProjectModelDto;
import com.leinao.team.dto.TeamMemberDto;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @Auther: weiwei
 * @Date: 2019/6/3 20:41
 * @Description:
 * @Version 1.0
 */
@Repository
public interface ModelMapper {

    /**
      * @Description  根据Id获取模型
      * @param modelId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:54
      */
    Model getModelById(@Param("modelId") Long modelId);

    /**
      * @Description  查询该数据集是否公开给用户
      * @param modelId
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/17 11:12
      */
    Integer getUserModelPublicStatus(@Param("modelId") Long modelId, @Param("userId") String userId);

    /**
      * @Description 获取用户是否关注模型
      * @param modelId
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:52
      */
    Integer getUserAttentionStatus(@Param("modelId") Long modelId, @Param("userId") String userId);

    /**
      * @Description 取消关注模型
      * @param modelId
      * @param attentionFlag
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:55
      */
    Integer deleteUserAttention(@Param("modelId") Long modelId, @Param("attentionFlag") Integer attentionFlag, @Param("userId") String userId);

    Integer updateUserAttention(@Param("modelId") Long modelId, @Param("attentionFlag") Integer attentionFlag, @Param("userId") String userId);

    Integer selectRecord(@Param("modelId") Long modelId, @Param("userId") String userId);

    /**
      * @Description  添加关注模型
      * @param modelId
      * @param attentionFlag
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:55
      */
    Integer insertUserAttention(@Param("modelId") Long modelId, @Param("attentionFlag") Integer attentionFlag, @Param("userId") String userId);

    /**
      * @Description  删除模型
      * @param modelId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:53
      */
    Integer deleteModel(@Param("modelId") Long modelId);

    /**
      * @Description 模型关注人数
      * @param modelId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:53
      */
    Integer getModelAttentionCount(@Param("modelId") Long modelId);

    /**
      * @Description  平台用户公开的模型列表(不包含自己创建的)
      * @param categoryId
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:52
      */
    List<PaiModelDto> getPublicModelsExceptOwn(@Param("categoryId") Long categoryId, @Param("userId") String userId);

    /**
      * @Description 平台用户公开的模型列表
      * @param categoryId
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:51
      */
    List<PaiModelDto> getPublicModels(@Param("categoryId") Long categoryId, @Param("userId") String userId);

    List<PaiModelDto> getModelCoverUrlList(@Param("modelIds") List<Long> modelIds);

    List<CategoryRelationDto> getCategoryListByObjectIdListAndType(@Param("modelIds") List<Long> modelIds, @Param("type") Integer type);

    /**
      * @Description  关注模型列表
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:57
      */
    List<PaiModelDto> getAttentionModels(@Param("userId") String userId);
    /**
      * 功能描述: 保存模型详情
      * @param model
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:09
      */
    Integer saveModelDetail(Model model);
    /**
      * 功能描述: 保存模型与任务关系
      * @param modelProJobRelation
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:09
      */
    Integer saveModelRelation(ModelProJobRelation modelProJobRelation);
    /**
      * 功能描述: 获取开发语言和框架
      * @param id
      * @Return:com.leinao.model.model.Model
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:10
      */
    Model getLanAndFra(@Param("id")Long id);

    /**
      * @Description  用户个人创建模型列表
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:58
      */
    List<PaiModelDto> getUserOwnModels(@Param("userId") String userId);

    //todo sql未写
    /**
      * @Description  用户个人模型列表(创建+关注)
      * @param userId
      * @return
      * @author:    weiwei
      * @Date:  2019/6/11 16:58
      */
    List<PaiModelDto> getUserModels(@Param("userId") String userId);

    /**
      * 功能描述: 获取项目列表
      * @param userId
      * @param projectName
      * @Return:java.util.List<com.leinao.model.dto.ProjectDto>
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:10
      */
    List<ProjectDto> getProName(@Param("userId")String userId,@Param("projectName")String projectName);
    /**
      * 功能描述: 获取任务列表
      * @param projectId
      * @param jobName
      * @Return:java.util.List<com.leinao.model.dto.JobDto>
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:10
      */
    List<JobDto> getJobName(@Param("projectId")Long projectId,@Param("jobName")String jobName);
    /**
      * 功能描述: 保存封面关系
      * @param modelCoverDto
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:10
      */
    Integer saveModelCover(ModelCoverDto modelCoverDto);
    /**
      * 功能描述: 获取模型详情中的项目
      * @param modelId
      * @Return:java.util.List<com.leinao.model.dto.ProjectDto>
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:11
      */
    List<ProjectDto> getProjectByModelId(@Param("modelId") Long modelId);
    /**
      * 功能描述: 获取模型详情中的项目的标签
      * @param modelId
      * @Return:java.util.List<com.leinao.category.dto.CategoryRelationDto>
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:11
      */
    List<CategoryRelationDto> getProjectTag(@Param("modelId")Long modelId);
    /**
      * 功能描述: 获取模型详情
      * @param modelId
      * @Return:com.leinao.model.model.Model
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:11
      */
    Model getModelDetail(@Param("modelId")Long modelId);
    /**
      * 功能描述: 修改模型简介
      * @param id
      * @param userId
      * @param introduction
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:12
      */
    Integer updateModelIntro(@Param("id")Long id,@Param("userId")String userId,@Param("introduction")String introduction);
    /**
      * 功能描述: 获取我的模型详情
      * @param modelId
      * @param userId
      * @Return:com.leinao.model.model.Model
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:12
      */
    Model getModelDetailForCreate(@Param("modelId")Long modelId,@Param("userId")String userId);
    /**
      * 功能描述: 获取我的模型详情的项目
      * @param modelId
      * @param userId
      * @Return:java.util.List<com.leinao.model.dto.ProjectDto>
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:12
      */
    List<ProjectDto> getProjectByModelIdForCreate(@Param("modelId") Long modelId,@Param("userId")String userId);
    /**
      * 功能描述: 保存标签模型关系
      * @param categoryRelation
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:12
      */
    Integer saveTagModelRelation(CategoryRelation categoryRelation);
    /**
      * 功能描述: 公开给个人用
      * @param userId
      * @param modelId
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:13
      */
    Integer savePersonalRelation(@Param("userId")String userId,@Param("modelId")Long modelId);
    /**
      * 功能描述: 公开给所有人
      * @param id
      * @param userId
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/11 19:13
      */
    Integer openModelToAll(@Param("id")Long id,@Param("userId")String userId);
    /**
      * 功能描述: 获取模型已公开给的个人
      * @param modelId
      * @Return:com.leinao.team.dto.TeamMemberDto
      * @Author:HuoPengfei
      * @Date:2019/6/12 19:54
      */
    List<TeamMemberDto> getPersonalRelation(@Param("modelId")Long modelId);
    /**
      * 功能描述: 取消个人关注
      * @param id
      * @param userId
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/12 19:56
      */
    Integer deletePersonalRelation(@Param("id")Long id,@Param("userId")String userId);
    /**
      * 功能描述:
      * @param modelId
      * @Return:java.lang.Long
      * @Author:HuoPengfei
      * @Date:2019/6/13 13:16
      */
    Long getFileReIdByModel(@Param("modelId")Long modelId);
    /**
      * 功能描述:
      * @param id
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/13 13:17
      */
    Integer deleteFileRelation(@Param("id")Long id);
    /**
      * 功能描述:
      * @param modelId
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/13 18:18
      */
    Integer deleteObjCategroyRe(@Param("modelId")Long modelId);
    /**
      * 功能描述:
      * @param modelId
      * @Return:java.util.List<java.lang.Long>
      * @Author:HuoPengfei
      * @Date:2019/6/13 18:18
      */
    List<Long> getOpenPersonal(@Param("modelId")Long modelId);
    /**
      * 功能描述:
      * @param modelId
      * @Return:java.util.List<com.leinao.model.dto.ModelCategoryDto>
      * @Author:HuoPengfei
      * @Date:2019/6/13 18:18
      */
    List<ModelCategoryDto> getOpenCategory(@Param("modelId")Long modelId);

    Long getModelForUserId(@Param("modelName")String modelName,@Param("userId")String userId);

    /**
     * 根据项目ID获取模型列表
     * @param projectId 项目ID
     * @Author:HuoPengfei
     * @Date:2019/6/14 15:18
     */
    List<Model> getModelListByProjectId(@Param("projectId") Long projectId);

    /**
     * @Description 获取所有进行分享的模型ID集合
     * @author lizi
     * @date 2018/12/18 下午5:10
     */
    List<Long> getModelSetIdList(@Param("userId") String userId);

    /**
      * 功能描述：根据项目id查询项目和模型关系记录id
      * @param projectId 项目id
      * @return java.util.List<java.lang.Long>
      * @Author: guoliangbo
      * @Date: 2019/6/14 18:48
      */
    List<Long> selectModelIdListByProjectId(@Param("projectId")Long projectId);

    /**
      * 功能描述：删除项目和模型关系
      * @param projectId 项目id
      * @param deleteModelIdList 待删除模型id
      * @return java.lang.Integer 影响行数
      * @Author: guoliangbo
      * @Date: 2019/6/14 18:55
      */
    Integer deleteProjectModelRelation(@Param("projectId") Long projectId, @Param("deleteModelIdList") List<Long> deleteModelIdList);

    /**
      * 功能描述：批量插入项目模型关系记录
      * @param projectModelRelationList 项目模型关系
      * @return java.lang.Integer 影响行数
      * @Author: guoliangbo
      * @Date: 2019/6/14 19:06
      */
    Integer batchInsertProjectModelRelation(@Param("projectModelRelationList")List<ProjectModelDto> projectModelRelationList);

    List<Model> getModelsTypes(@Param("modelIds")List<Long> list);
    /**
      * 功能描述: 取消公开取消关注
      * @param id
      * @param userId
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/17 11:26
      */
    Integer updateUserModelZero(@Param("id")Long id,@Param("userId")String userId);
    /**
      * 功能描述: 校验个人模型公开情况
      * @param modelId
      * @param userId
      * @Return:java.lang.Long
      * @Author:HuoPengfei
      * @Date:2019/6/17 13:16
      */
    Long getUserModelRela(@Param("modelId")Long modelId,@Param("userId")String userId);
    /**
      * 功能描述: 获取项目ID列表
      * @param modelId
      * @param userId
      * @Return:java.util.List<java.lang.Long>
      * @Author:HuoPengfei
      * @Date:2019/6/21 19:32
      */
    List<Long> getProjectId(@Param("modelId")Long modelId,@Param("userId")String userId);
    /**
      * 功能描述: 删除项目与模型的关系
      * @param modelId
      * @param projectIdList
      * @Return:java.lang.Integer
      * @Author:HuoPengfei
      * @Date:2019/6/21 19:32
      */
    Integer deleteProjectModelRelationForProjectId(@Param("modelId")Long modelId, @Param("projectIdList")List<Long> projectIdList);
}
